package at.tyron.vintagecraft;
import at.tyron.vintagecraft.Client.CreativeTabsVC;
import at.tyron.vintagecraft.Item.ItemArmorVC;
import at.tyron.vintagecraft.Network.AnvilTechniquePacket;
import at.tyron.vintagecraft.Network.CarpentryTechniquePacket;
import at.tyron.vintagecraft.Network.ChunkPutNbtPacket;
import at.tyron.vintagecraft.Network.ChunkRemoveNbtPacket;
import at.tyron.vintagecraft.Network.MechanicalNetworkNBTPacket;
import at.tyron.vintagecraft.Network.SoundEffectToServerPacket;
import at.tyron.vintagecraft.Network.StartMeteorShowerPacket;
import at.tyron.vintagecraft.Network.WorldDataPacket;
import at.tyron.vintagecraft.World.BlocksVC;
import at.tyron.vintagecraft.World.ItemsVC;
import at.tyron.vintagecraft.World.MechnicalNetworkManager;
import at.tyron.vintagecraft.World.VCraftWorldSavedData;
import at.tyron.vintagecraft.World.WindGen;
import at.tyron.vintagecraft.World.Crafting.EnumAnvilRecipe;
import at.tyron.vintagecraft.World.Crafting.EnumCarpentryRecipes;
import at.tyron.vintagecraft.World.Crafting.Recipes;
import at.tyron.vintagecraft.WorldGen.DynTreeGenerators;
import at.tyron.vintagecraft.WorldGen.WorldGenDeposits;
import at.tyron.vintagecraft.WorldGen.Helper.WorldProviderVC;
import at.tyron.vintagecraft.WorldGen.Helper.WorldTypeVC;
import net.minecraft.command.ICommandManager;
import net.minecraft.command.ServerCommandManager;
import net.minecraft.entity.EnumCreatureType;
import net.minecraft.entity.monster.EntityZombie;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ChatComponentText;
import net.minecraft.world.EnumDifficulty;
import net.minecraft.world.World;
import net.minecraft.world.WorldType;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
import net.minecraftforge.event.entity.living.LivingDeathEvent;
import net.minecraftforge.event.entity.living.LivingDropsEvent;
import net.minecraftforge.event.entity.living.LivingSpawnEvent.SpecialSpawn;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.Mod.Instance;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLInterModComms;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.ReflectionHelper;
import net.minecraftforge.fml.relauncher.Side;
/*
* Things to add before for a "Update requires new world":
* - Wood type chests
* - New trees, plants, rocktypes, etc.
*/
@Mod(modid = ModInfo.ModID, version = ModInfo.ModVersion)
public class VintageCraft {
@Instance("vintagecraft")
public static VintageCraft instance;
@SidedProxy(clientSide = ModInfo.CLIENT_PROXY_CLASS, serverSide = ModInfo.SERVER_PROXY_CLASS)
public static CommonProxy proxy;
public static final SimpleNetworkWrapper packetPipeline = NetworkRegistry.INSTANCE.newSimpleChannel("vintagecraft");
public static CreativeTabsVC terrainTab = new CreativeTabsVC(CreativeTabsVC.getNextID(), "terrain");
public static CreativeTabsVC floraTab = new CreativeTabsVC(CreativeTabsVC.getNextID(), "flora");
public static CreativeTabsVC resourcesTab = new CreativeTabsVC(CreativeTabsVC.getNextID(), "resources");
public static CreativeTabsVC craftedBlocksTab = new CreativeTabsVC(CreativeTabsVC.getNextID(), "craftedblocks");
public static CreativeTabsVC toolsarmorTab = new CreativeTabsVC(CreativeTabsVC.getNextID(), "toolsandarmor");
public static CreativeTabsVC mechanicsTab = new CreativeTabsVC(CreativeTabsVC.getNextID(), "mechanics");
@EventHandler
public static void preInit(FMLPreInitializationEvent event) {
VintageCraftConfig.loadConfig(event);
}
ButterflySpawner spawner;
@EventHandler
public void init(FMLInitializationEvent event) throws Exception {
packetPipeline.registerMessage(AnvilTechniquePacket.Handler.class, AnvilTechniquePacket.class, 0, Side.SERVER);
packetPipeline.registerMessage(ChunkPutNbtPacket.Handler.class, ChunkPutNbtPacket.class, 1, Side.CLIENT);
packetPipeline.registerMessage(ChunkRemoveNbtPacket.Handler.class, ChunkRemoveNbtPacket.class, 2, Side.CLIENT);
packetPipeline.registerMessage(SoundEffectToServerPacket.Handler.class, SoundEffectToServerPacket.class, 3, Side.SERVER);
packetPipeline.registerMessage(MechanicalNetworkNBTPacket.ClientHandler.class, MechanicalNetworkNBTPacket.class, 4, Side.CLIENT);
packetPipeline.registerMessage(StartMeteorShowerPacket.ClientHandler.class, StartMeteorShowerPacket.class, 5, Side.CLIENT);
packetPipeline.registerMessage(WorldDataPacket.ClientHandler.class, WorldDataPacket.class, 6, Side.CLIENT);
packetPipeline.registerMessage(CarpentryTechniquePacket.Handler.class, CarpentryTechniquePacket.class, 7, Side.SERVER);
BlocksVC.init();
ItemsVC.init();
AchievementsVC.init();
FMLCommonHandler.instance().bus().register(this);
FMLCommonHandler.instance().bus().register(spawner = new ButterflySpawner());
MinecraftForge.EVENT_BUS.register(this);
proxy.registerTileEntities();
NetworkRegistry.INSTANCE.registerGuiHandler(instance, proxy);
GameRegistry.registerWorldGenerator(new WorldGenDeposits(), 4);
WorldType.DEFAULT = WorldTypeVC.DEFAULT;
WorldType.FLAT = WorldTypeVC.FLAT;
// DimensionManager.unregisterDimension(-1);
DimensionManager.unregisterDimension(0);
DimensionManager.unregisterDimension(1);
//DimensionManager.unregisterProviderType(-1);
DimensionManager.unregisterProviderType(0);
DimensionManager.unregisterProviderType(1);
DimensionManager.registerProviderType(0, WorldProviderVC.class, true);
DimensionManager.registerProviderType(1, WorldProviderVC.class, false);
//DimensionManager.registerDimension(-1, -1);
DimensionManager.registerDimension(0, 0);
DimensionManager.registerDimension(1, 1);
proxy.init(event);
}
@EventHandler
public void postInit(FMLPostInitializationEvent event) {
proxy.postInit(event);
ItemsVC.initTabIcons();
DynTreeGenerators.initGenerators();
Recipes.addRecipes();
EnumAnvilRecipe.registerRecipes();
EnumCarpentryRecipes.registerRecipes();
FMLInterModComms.sendRuntimeMessage(VintageCraft.instance, "butterflymania", "butterflymania-disabledefaultspawn", "");
}
@EventHandler
public void onServerStart(FMLServerStartingEvent evt) {
MinecraftServer server = MinecraftServer.getServer();
ICommandManager command = server.getCommandManager();
ServerCommandManager manager = (ServerCommandManager) command;
manager.registerCommand(new ServerCommandsVC());
}
@SubscribeEvent
public void entityJoin(EntityJoinWorldEvent evt) {
if (!evt.world.isRemote && evt.entity instanceof EntityPlayerMP) {
packetPipeline.sendTo(new WorldDataPacket(evt.world.getSeed()), (EntityPlayerMP)evt.entity);
}
if (evt.entity instanceof EntityZombie) {
if (((EntityZombie)evt.entity).isChild()) {
((EntityZombie)evt.entity).setChild(false);
evt.setCanceled(true);
}
}
}
@SubscribeEvent
public void entitySpawn(SpecialSpawn evt) {
if (evt.world.isRemote) return;
VintageCraftMobTweaker.entitySpawn(evt);
}
@SubscribeEvent
public void entityDeath(LivingDeathEvent evt) {
if (evt.entityLiving instanceof EntityZombie && evt.source.getEntity() instanceof EntityPlayer) {
ItemStack[]inventory = evt.entityLiving.getInventory();
int numArmorItems = 0;
for (ItemStack stack : inventory) {
if (stack != null && stack.getItem() instanceof ItemArmorVC) {
ItemArmorVC armoritem = (ItemArmorVC)stack.getItem();
if (armoritem.getArmorMaterial().name().equals("IRONVC")) numArmorItems++;
}
}
if (numArmorItems == 4) {
((EntityPlayer)evt.source.getEntity()).triggerAchievement(AchievementsVC.killIronArmorZombie);
}
}
}
public VCraftWorldSavedData getOrCreateWorldData(World world) {
VCraftWorldSavedData worlddata;
worlddata = (VCraftWorldSavedData) world.getPerWorldStorage().loadData(VCraftWorldSavedData.class, "vcraft");
if (worlddata == null) {
worlddata = new VCraftWorldSavedData("vcraft");
world.getPerWorldStorage().setData("vcraft", worlddata);
}
return worlddata;
}
@SubscribeEvent
public void loadWorld(WorldEvent.Load evt) {
VintageCraftMobTweaker.setSpawnCap(EnumCreatureType.MONSTER, VintageCraftMobTweaker.spawnCapByDay(evt.world.getTotalWorldTime() / 24000L, evt.world.getDifficulty()));
WindGen.registerWorld(evt.world);
}
@SubscribeEvent
public void unloadWorld(WorldEvent.Unload evt) {
WindGen.unregisterWorld(evt.world);
VCraftWorldSavedData worlddata = getOrCreateWorldData(evt.world);
MechnicalNetworkManager.unloadManagers();
}
@SubscribeEvent
public void onServerTick(TickEvent.WorldTickEvent event) {
if (
FMLCommonHandler.instance().getMinecraftServerInstance() == null ||
event.phase == TickEvent.Phase.END ||
event.world.provider.getDimensionId() != 0
) return;
if (MechnicalNetworkManager.getNetworkManagerForWorld(event.world) == null) {
VCraftWorldSavedData worlddata = getOrCreateWorldData(event.world);
worlddata.setWorld(event.world);
MechnicalNetworkManager.addManager(event.world, worlddata.getNetworks());
}
long worldtime = event.world.getTotalWorldTime();
long timeofday = event.world.getWorldTime() / 24000L;
if (worldtime % 6000L == 0) {
VintageCraftMobTweaker.setSpawnCap(EnumCreatureType.MONSTER, VintageCraftMobTweaker.spawnCapByDay(worldtime / 24000L, event.world.getDifficulty()));
VintageCraftConfig.saveConfig();
}
int moonphase = event.world.provider.getMoonPhase(event.world.getWorldTime());
boolean cannotSleeptonight =
moonphase == 0 ||
(event.world.getDifficulty() == EnumDifficulty.HARD && (moonphase == 7 || moonphase == 1))
;
if (cannotSleeptonight) {
for (Object obj : event.world.playerEntities) {
EntityPlayer player = (EntityPlayer)obj;
if (player.isPlayerSleeping() && getSleepTimer(player) > 80) {
player.wakeUpPlayer(true, true, true);
player.addChatMessage(new ChatComponentText("You tried to fall sleep, but something is keeping you awake tonight."));
}
}
}
long day = worldtime / 24000L;
if (day > 0 && day % 20 == 0 && timeofday % 24000L == 14000) {
packetPipeline.sendToAll(new StartMeteorShowerPacket(10000));
MinecraftServer.getServer().getConfigurationManager().sendChatMsg(new ChatComponentText("Something strange is happening in the night sky"));
}
}
public int getSleepTimer(EntityPlayer player) {
int timer = ReflectionHelper.getPrivateValue(EntityPlayer.class, player, 20);
return timer;
}
@SubscribeEvent
public void onEvent(LivingDropsEvent event) {
VintageCraftMobTweaker.tweakDrops(event);
}
}